﻿#ifndef IAPISERVICE_H
#define IAPISERVICE_H

#include <QObject>
#include <QMap>
#include "Interface_Global.h"
#include "IEngine.h"

namespace CVV
{
namespace Interface
{
class INTERFACE_EXPORT IApiService : public QObject
{
    Q_OBJECT
public:
    enum RunStatus
    {
       stop=0,
       running=1
    };

    explicit IApiService(const QString &serviceCode, bool bIsAlgCall = false, QObject *parent = nullptr);
    virtual ~IApiService();

    /**
     * @brief start 启动服务 初始化方案及对应单元插件，及注册引擎实例
     * @return
     */
    virtual bool start(int iProfileProductId) = 0;

    /**
     * @brief runStatus 运行状态
     * @param engineKey
     * @return
     */
    RunStatus runStatus(const QString engineKey = "Debug") const;
    void setRunStatus(RunStatus newRunStatus, const QString engineKey = "Debug");

    /**
     * @brief registerDebugEngine 注册调试引擎
     * @param engine
     */
    void registerDebugEngine(const QList<IEngine*> &engine);

    /**
     * @brief getEngine
     * @param engineKey
     * @return
     */
    QList<IEngine *> getEngine(const QString &engineKey = "Debug");

protected:
    /**
     * @brief clearEngine 清空引擎
     */
    void clearEngine();

 private:
    /**
     * @brief 加载配置及对应方案映射关系
     */
    bool load();

signals:
    /**
     * @brief receiveDataReady 接收数据已经准备好了
     * @param imgHeader 图片头部信息
     * @param picture 图片信息
     * @param doc 算法方案Dom
     */
    void sigReceiveDataReady(const QString &imgHeader, const QImage &picture);
    /**
     * @brief cvv 引擎处理完向控制面板发送处理完的结果
     * @param imgHeader 图片头部信息 任务号0001-工件号01-图号01-通道号01-缺陷编号01-扩展
     * @param JsonData 处理完的数据
     */
    void sigEngineProcessdataFinish(const QString &imgHeader,const QStringList &JsonData);

    /**
     * @brief slotInspectResultReady 执行完方案:数据发送插件调用信号触发把格式化的检测Json数据发送出来 由次槽函数接收
     * @param imgHeader 图片头部信息 任务号0001-工件号01-图号01-通道号01-缺陷编号01-扩展
     * @param jsonRes  检测缺陷结果
     */
    void sigInspectResultReady(const QString &imgHeader, const QStringList & jsonRes);

    /**
     * @brief slotStartNetService 网络服务插件发送信号由这个槽函数接收
     * @param port
     */
    void sigStartNetService(const QString &engineKey,int port);

public slots:
    /**
     * @brief slotRunStatus 接收运行界面控制状态
     * @param runStatus 运行状态
     */
    void slotRunStatus(const RunStatus runStatus, const QString engineKey="Debug");
    /**
     * @brief slotInspectResultReady 执行完方案:数据发送插件调用信号触发把格式化的检测Json数据发送出来 由次槽函数接收
     * @param imgHeader 图片头部信息 任务号0001-工件号01-图号01-通道号01-缺陷编号01-扩展
     * @param jsonRes  检测缺陷结果
     */
    virtual void slotInspectResultReady(const QString &imgHeader,const QString & jsonRes)=0;

protected:
    /**
     * @brief key 配置ID-映射图号，val对应方案
     */
    QMap<QString, QList<QDomDocument>> m_planDomMaps;

    /**
     * @brief key 配置ID-映射图号，val对应方案
     */
    QMap<QString, QList<QDomDocument>> m_visualGuidanceDomMaps;     // 视觉引导方案

    /**
     * @brief key 配置ID-映射图号，val<方案类型barcode/fixPosition, 对应方案>
     */
    QMap<QString, QMap<QString, QList<QDomDocument>>> m_generalDomMaps;

    /**
     * @brief m_enginMaps key 配置ID-映射图号,val 引擎实例指针
     */
    QMap<QString, QList<IEngine *>> m_enginMaps;
    bool m_bIsAlgCall;                              // 是否算法调用
    QString m_strServiceCode;                       // 服务代码

private:
   /**
    * @brief 运行状态
    */
   QMap<QString, RunStatus> m_runStatusList;

};
}
}
#endif // IAPISERVICE_H
